/*
 * Created: Author: Aléx Carvalho / Date: Feb 26, 2015
 * 
 * Changed: $Author: ac280593@gmail.com $ / $Date: 2015-05-19 04:08:49 +0000 (Tue, 19 May 2015) $
 */
package com.cpm.repository;

import java.util.List;
import javax.persistence.metamodel.Attribute;

public interface Filter {
    
    public <T> List<T> getResultList(Class<T> entity);

    public <T> T getSingleResult(Class<T> entity);

    public Long count(Class entity);
    
    public List getMultiSelectResult(Class entity);

    public Filter andEquals(final Attribute attributeName, final Object value);

//    public Filter andEqualsIgnoreCase(final Attribute attributeName, final Object value);
//
//    public Filter orEquals(final Attribute attributeName, final Object... valueArray);
//
//    public Filter orEqualsIgnoreCase(final Attribute attributeName, final Object... valueArray);

//    public DefaultCriteria orEquals(int index, final Attribute attributeName, final Object... valueArray);

//    public DefaultCriteria orEqualsIgnoreCase(int index, final Attribute attributeName, final String... valueArray);
    
//    public Filter andStringLike(final Attribute attributeName, final String value);
//
//    public Filter andStringLikeIgnoreCase(final Attribute attributeName, final String value);
//
//    public Filter andStringNotLike(final Attribute attributeName, final String value);
//
//    public Filter andStringNotLikeIgnoreCase(final Attribute attributeName, final String value);
//
//    public Filter orStringLike(final Attribute attributeName, String... stringArray);
//
//    public Filter orStringLikeIgnoreCase(final Attribute attributeName, String... stringArray);
//
//    public Filter orStringNotLike(final Attribute attributeName, String... stringArray);
//
//    public Filter orStringNotLikeIgnoreCase(final Attribute attributeName, String... stringArray);

//    public DefaultCriteria andIsMemberOf(Object value, String collectionName);

//    public DefaultCriteria andIsNotMemberOf(Object value, String collectionName);

//    public Filter andNotEquals(final Attribute attributeName, final Object value);
//
//    public Filter andNotEqualsIgnoreCase(final Attribute attributeName, final Object value);
//
//    public Filter orNotEquals(final Attribute attributeName, final Object... valueArray);
//
//    public Filter orNotEqualsIgnoreCase(final Attribute attributeName, final Object... valueArray);

//    public DefaultCriteria andGreaterThan(final Attribute attributeName, final Object value);
//
//    public DefaultCriteria andGreaterThan(final boolean toLowerCase, final Attribute attributeName, final String value);
//
//    public DefaultCriteria andGreaterOrEqualTo(final Attribute attributeName, final Object value);
//
//    public DefaultCriteria andGreaterOrEqualTo(final boolean toLowerCase, final Attribute attributeName, final String value);
//
//    public DefaultCriteria andLessThan(final Attribute attributeName, final Object value);
//
//    public DefaultCriteria andLessThan(final boolean toLowerCase, final Attribute attributeName, final String value);
//
//    public DefaultCriteria andLessOrEqualTo(final Attribute attributeName, final Object value);
//
//    public DefaultCriteria andLessOrEqualTo(final boolean toLowerCase, final Attribute attributeName, final String value);
//
//    public DefaultCriteria innerJoin(final String joinName);
//
//    public DefaultCriteria leftJoin(final String joinName);
//
//    public DefaultCriteria innerJoinFetch(final String joinName);
//
//    public DefaultCriteria leftJoinFetch(final String joinName);

//    public Filter setDistinctTrue();
//
//    public Filter andBetween(final Attribute attributeName, final Object valueA, final Object valueB);
//
//    public Filter andBetweenIgnoreCase(final Attribute attributeName, final Object valueA, final Object valueB);
//
//    public Filter andIsNull(final Attribute attributeName);
//
//    public Filter orIsNull(final Attribute attributeName);
//
//    public Filter andIsNotNull(final Attribute attributeName);
//
//    public Filter orIsNotNull(final Attribute attributeName);
//
//    public DefaultCriteria andCollectionIsEmpty(final String collectionName);
//
//    public DefaultCriteria andCollectionIsNotEmpty(final String collectionName);
//
//    public <E> Filter andAttributeIn(final Attribute attributeName, final List<E> attributeList);
//
//    public <E> Filter andAttributeIn(final Attribute attributeName, final Filter<E> subQuery);
//
//    public <E> Filter andAttributeNotIn(final Attribute attributeName, final List<E> attributeList);
//
//    public <E> Filter andAttributeNotIn(final Attribute attributeName, final Filter<E> subQuery);
//
//    public Filter andStringIn(final Attribute attributeName, final List<String> valueList);
//
//    public Filter andStringInIgnoreCase(final Attribute attributeName, final List<String> valueList);
//
//    public Filter andStringNotIn(final Attribute attributeName, final List<String> valueList);
//
//    public Filter andStringNotInIgnoreCase(final Attribute attributeName, final List<String> valueList);
//
//    public Filter orderByAsc(final Attribute attributeName);
//
//    public Filter orderByDesc(final Attribute attributeName);
//
//    public Filter setFirstResult(final Integer firstResult);
//
//    public Filter setMaxResults(final Integer maxResults);
//
//    public Filter addAndSeparatedByOr(final int index, final Attribute attributeName, final Object value);
//
//    public Filter addAndSeparatedByOr(final boolean toLowerCase, final int index, final Attribute attributeName, final String value);
//
//    public Filter countAttribute(final Attribute... attributeNameArray);
//
//    public Filter addHint(final String key, final String value);
//
    public Filter sum(final Attribute... attributeNameArray);
//
//    public <N extends Number> Filter sum(final Attribute attributeName, final N number);
//
//    public <N extends Number> Filter sum(final N number, final Attribute attributeName);
//
//    public Filter diff(final String firstAttribute, final String secondAttribute);
//
//    public <N extends Number> Filter diff(final Attribute attributeName, final N number);
//
//    public <N extends Number> Filter diff(final N number, final Attribute attributeName);
//
    public Filter multiply(final Attribute firstAttribute, final Attribute secondAttribute);
//
//    public <N extends Number> Filter multiply(final Attribute attributeName, final N number);
//
//    public <N extends Number> Filter multiply(final N number, final Attribute attributeName);
//
//    public Filter divide(final Attribute firstAttribute, final Attribute secondAttribute);
//
//    public <N extends Number> Filter divide(final Attribute attributeName, final N number);
//
//    public <N extends Number> Filter divide(final N number, final Attribute attributeName);
//
//    public Filter module(final String firstAttribute, final String secondAttribute);
//
//    public Filter module(final Attribute attributeName, final Integer number);
//
//    public Filter module(final Integer number, final Attribute attributeName);
//
//    public Filter average(final Attribute... attributeNameArray);
//
//    public Filter square(final Attribute... attributeNameArray);
//
//    public Filter addMultiSelectAttribute(final String... attributeNameArray);
//
//    public Filter groupBy(final Attribute... attributeNameArray);
}
